
"use strict";
const Parser = require('expr-eval').Parser;
/**
 * @name hook
 * 挂机系统
 */


/**
 * @name init_hook
 * 挂机初始化
 */
exports.init_hook = function () {
    this.updater.role.key("onhook");
    return this.updater.data().then(() => {
        let onhook = this.updater.role.get("onhook") || 0;
        if (onhook != 0) {
            return this.quick_error("m2sgrbs1", "已经初始化过了", onhook);
        }
        this.updater.role.set('onhook', this.updater.time);
        return this.updater.save();
    });
}



/**
 * @name claim_hook
 * 获取挂机奖励
 */
exports.claim_hook = async function () {
    this.updater.role.key('battlePoint');
    this.updater.role.key("onhook");
    await this.updater.data();
    let id = this.updater.role.get('battlePoint') || 1;
    let onhook = this.updater.role.get("onhook") || 0;
    let stageConfig = this.config("challenge");
    if (!stageConfig) {
        return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
    }
    let _total_add = {};
    let _hook_add = {};
    for (let i in stageConfig) {
        if (stageConfig[i].chapterStart <= id && stageConfig[i].chapterEnd >= id) {
            let data = stageConfig[i].offlineReward.split(',');
            let num = 0;
            if (onhook == 0) {
                //第一次领取
                return this.quick_error("m2sgrbs1", "挂机未被初始化", onhook);
            }
            let completeTime = this.updater.time - onhook;
            let maxTime = this.config("base", "maxTime").val * 60 * 1000;
            let subTime = Math.min(maxTime, completeTime);
            num = parseInt(subTime / (stageConfig[i].frequency * 1000));
            if (num != 0) {
                for (let k = 0; k < data.length; k++) {
                    let itemData = data[k].split(":");
                    let itemID = itemData[0];
                    let formulaID = itemData[1];
                    let formulaData = this.config("formula", formulaID);
                    let formula = formulaData.expression;
                    var parser = new Parser();
                    let expression = parser.parse(formula);
                    let result = parseInt(expression.evaluate({ CHAPTER_LV: id }));
                    if (parseInt(itemID / 1000000) == 70) {
                        _hook_add[itemID] = result * num;
                    } else {
                        _total_add[itemID] = result * num;
                    }
                }
                //判断是否满了时间
                if (maxTime > completeTime) {
                    this.updater.role.set('onhook', onhook + num * stageConfig[i].frequency * 1000);
                } else {
                    this.updater.role.set('onhook', this.updater.time)
                }
            }
        }
    }
    for (let i in _hook_add) {
        let id = parseInt(i);
        if (id) {
            for (let j = 0; j < _hook_add[id]; ++j) {
                let { err, ret } = this.library("item/group", id, 1);
                if (err) {
                    return this.error(err, ret);
                }
                if (Array.isArray(ret)) {
                    for (let v in ret) {
                        if (_total_add.hasOwnProperty(ret[v].id)) {
                            _total_add[ret[v].id] += ret[v].num;
                        } else {
                            _total_add[ret[v].id] = ret[v].num;
                        }
                    }
                } else {
                    if (_total_add.hasOwnProperty(ret.id)) {
                        _total_add[ret.id] += ret.num;
                    } else {
                        _total_add[ret.id] = ret.num;
                    }
                }

            }
        }
    }
    for (let i in _total_add) {
        this.updater.add(parseInt(i), _total_add[i]);
    }
    this.updater.record.add(33, 1);
    this.updater.daily.add("record.33", 1);
    return this.updater.save();
}

/**
 * @name buy_hook_reward
 * 购买挂机奖励
 * @tip 加速记录为 daily.hookSNum
 */
exports.buy_hook_reward = async function () {


    this.updater.role.key('battlePoint');
    this.updater.role.key("onhook");
    this.updater.daily.key("hookSNum");
    await this.updater.data();
    let id = this.updater.role.get('battlePoint') || 1;
    let onhook = this.updater.role.get("onhook") || 0;

    let speedBuyNum = this.updater.daily.get('hookSNum') || 0;
    //默认次数
    const hookCostBaseConfig = this.config("dailyGrowthCost", speedBuyNum + 1);
    if (!hookCostBaseConfig) {
        return this.quick_error("m2sgrbs1", "配置不存在", "hookCost", speedBuyNum);
    }
    const hookCostConfig = hookCostBaseConfig.hook;
    if (!hookCostConfig) {
        return this.quick_error("m2sgrbs1", "配置不存在", "hookCost", speedBuyNum);
    }
    if (hookCostConfig.itemID == 0) {
        return this.quick_error("m2sgrbs1", "配置不存在", "hookCost", speedBuyNum);
    }
    this.updater.item.sub(hookCostConfig.itemID, hookCostConfig.cost);

    let stageConfig = this.config("challenge");
    if (!stageConfig) {
        return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
    }
    let _total_add = {};
    let _hook_add = {};
    for (let i in stageConfig) {
        if (stageConfig[i].chapterStart <= id && stageConfig[i].chapterEnd >= id) {
            let data = stageConfig[i].offlineReward.split(',');
            let num = 0;
            if (onhook == 0) {
                //第一次领取
                return this.quick_error("m2sgrbs1", "挂机未被初始化", onhook);
            }
            let subTime = 2 * 60 * 60 * 1000;
            num = parseInt(subTime / (stageConfig[i].frequency * 1000));
            for (let k = 0; k < data.length; k++) {
                let itemData = data[k].split(":");
                let itemID = itemData[0];
                let formulaID = itemData[1];
                let formulaData = this.config("formula", formulaID);
                let formula = formulaData.expression;
                var parser = new Parser();
                let expression = parser.parse(formula);
                let result = parseInt(expression.evaluate({ CHAPTER_LV: id }));
                if (parseInt(itemID / 1000000) == 70) {
                    _hook_add[itemID] = result * num;
                } else {
                    _total_add[itemID] = result * num;
                }
            }
        }
    }
    this.updater.daily.set("hookSNum", speedBuyNum + 1);
    for (let i in _hook_add) {
        let id = parseInt(i);
        if (id) {
            for (let j = 0; j < _hook_add[id]; ++j) {
                let { err, ret } = this.library("item/group", id, 1);
                if (err) {
                    return this.error(err, ret);
                }
                if (Array.isArray(ret)) {
                    for (let v in ret) {
                        if (_total_add.hasOwnProperty(ret[v].id)) {
                            _total_add[ret[v].id] += ret[v].num;
                        } else {
                            _total_add[ret[v].id] = ret[v].num;
                        }
                    }
                } else {
                    if (_total_add.hasOwnProperty(ret.id)) {
                        _total_add[ret.id] += ret.num;
                    } else {
                        _total_add[ret.id] = ret.num;
                    }
                }

            }
        }
    }
    for (let i in _total_add) {
        this.updater.add(parseInt(i), _total_add[i]);
    }
    this.updater.record.add(33, 1);
    this.updater.daily.add("record.33", 1);
    this.updater.record.add(68, 1);
    this.updater.daily.add("record.68", 1);
    return this.updater.save();
}




// /**
//  * @name claim_hook
//  * 获取挂机奖励
//  */
// exports.claim_hook = function () {
//     this.updater.role.key("onhook", 'stage', 'gs', 'hangPoint', 'hangReward');
//     this.updater.daily.key('hookCNum');
//     return this.updater.data().then(() => {
//         return finish_hook.call(this, 0, 1);
//     })
// }


// /**
//  * @name look_hook_reward
//  * 预览挂机奖励
//  */
// exports.look_hook_reward = function () {
//     this.updater.role.key("onhook", 'stage', 'gs', 'hangPoint', 'hangReward');
//     this.updater.daily.key('hookCNum');
//     return this.updater.data().then(async () => {
//         let ret = await finish_hook.call(this, 0, 0);
//         return ret;
//     })
// }



// /**
//  * @name buy_hook_reward
//  * 购买挂机奖励
//  * @tip 加速记录为 daily.hookSNum
//  */
// exports.buy_hook_reward = function () {
//     this.updater.role.key("onhook", "stage", 'gs', 'hangPoint');
//     this.updater.daily.key("hookSNum");
//     return this.updater.data().then(() => {
//         let speedBuyNum = this.updater.daily.get('hookSNum') || 0;
//         //默认次数
//         let next = speedBuyNum + 1;
//         // let speedBuyConfig = this.config("hookBase", next);
//         // if (!speedBuyConfig) {
//         //     return this.quick_error("m2sgrbs10", "加速次数不足", speedBuyNum, next);
//         // }
//         const hookCostBaseConfig = this.config("dailyGrowthCost", speedBuyNum + 1);
//         if (!hookCostBaseConfig) {
//             return this.quick_error("m2sgrbs1", "配置不存在", "hookCost", speedBuyNum);
//         }
//         const hookCostConfig = hookCostBaseConfig.hook;
//         if (!hookCostConfig) {
//             return this.quick_error("m2sgrbs1", "配置不存在", "hookCost", speedBuyNum);
//         }
//         if (hookCostConfig.itemID == 0) {
//             return this.quick_error("m2sgrbs1", "配置不存在", "hookCost", speedBuyNum);
//         }
//         console.log("测试扣件物品:", hookCostConfig.itemID, hookCostConfig.cost);
//         this.updater.item.sub(hookCostConfig.itemID, hookCostConfig.cost);
//         //给2个小时的奖励
//         let hangPoint = this.updater.role.get("hangPoint") || 0;
//         let rewardConfig = this.config("hookReward", hangPoint);
//         if (!rewardConfig) {
//             return this.quick_error("m2sgrbs1", "配置不存在", "hookReward", hangPoint);
//         }


//         let _total_add = {};
//         let _hook_add = {};
//         for (let i = 0; i < rewardConfig.hookGroup.length; i++) {
//             let numB = 0;
//             let tt = 2 * 60 * 60 * 1000;
//             numB = Math.floor(rewardConfig["hookGroup"][i].num * tt / (rewardConfig["hookGroup"][i].time * 1000));
//             if (numB <= 0) {
//                 continue;
//             }
//             if (parseInt(rewardConfig["hookGroup"][i].itemID / 1000000) == 70) {
//                 _hook_add[rewardConfig["hookGroup"][i].itemID] = numB;
//             } else {
//                 _total_add[rewardConfig["hookGroup"][i].itemID] = numB;
//             }
//         }
//         for (let i in _hook_add) {
//             let id = parseInt(i);
//             if (id) {
//                 for (let j = 0; j < _hook_add[id]; ++j) {
//                     let { err, ret } = this.library("item/group", id, 1);
//                     if (err) {
//                         return this.error(err, ret);
//                     }
//                     if (Array.isArray(ret)) {
//                         for (let v in ret) {
//                             if (_total_add.hasOwnProperty(ret[v].id)) {
//                                 _total_add[ret[v].id] += ret[v].num;
//                             } else {
//                                 _total_add[ret[v].id] = ret[v].num;
//                             }
//                         }
//                     } else {
//                         if (_total_add.hasOwnProperty(ret.id)) {
//                             _total_add[ret.id] += ret.num;
//                         } else {
//                             _total_add[ret.id] = ret.num;
//                         }
//                     }

//                 }
//             }
//         }
//         for (let i in _total_add) {
//             this.updater.add(parseInt(i), _total_add[i]);
//         }
//         this.updater.daily.set("hookSNum", next);
//         return;
//     }).then(() => {
//         return this.updater.save();
//     })
// }



// async function finish_hook(add_tt, t) {
//     //t 0 预览挂机奖励 1 实际领取挂机奖励
//     // let specAwardOffset = 1;
//     // let api = '/active/getSupActive', data = {"s_type": 'hookDouble'};
//     // let ret = await this.library('spirit/gzone', api, data);
//     // if (ret) {
//     //     let config = await this.library.call(this.updater, 'shop/filterOne', ret);
//     //     if (config) {
//     //         specAwardOffset = 2;
//     //     }
//     // }
//     let tt = 0;
//     let nowtime = this.updater.time;
//     let onhook = this.updater.role.get("onhook");
//     let hangReward = this.updater.role.get("hangReward") || {};
//     let hangPoint = this.updater.role.get("hangPoint") || 0;
//     let rewardConfig = this.config("hookReward", hangPoint);
//     if (!rewardConfig) {
//         return this.quick_error("m2sgrbs1", "配置不存在", "hookReward", hangPoint);
//     }
//     let _total_add = {};
//     let _hook_add = {};
//     if (t) {
//         onhook.lastGetRewardTime = nowtime;
//         // onhook[i].flag = 0;
//     }
//     for (let i = 0; i < rewardConfig["hookGroup"].length; i++) {

//         // if (t && onhook[i].flag) {

//         if (add_tt) {
//             //加速模式
//             tt = Math.min(this.config("base", "maxTime").val * 60 * 1000, add_tt);
//         } else {
//             //普通领取
//             tt = Math.min(this.config("base", "maxTime").val * 60 * 1000, (nowtime - onhook.lastCompleteTime));
//         }
//         let numB = 0;
//         numB = Math.floor(rewardConfig["hookGroup"][i].num * tt / (rewardConfig["hookGroup"][i].time * 1000));
//         if (numB <= 0) {
//             continue;
//             // return this.quick_error("m2sgrbs12", "没有达到最低挂机时间", add_tt);
//         }

//         // if (t) {
//         //     onhook[i].flag = 0;
//         // } else {
//         //     onhook[i].flag = 1;
//         // }
//         // this.updater.add(parseInt(i), _total_add[i]);
//         if (parseInt(rewardConfig["hookGroup"][i].itemID / 1000000) == 70) {
//             _hook_add[rewardConfig["hookGroup"][i].itemID] = numB;
//         } else {
//             _total_add[rewardConfig["hookGroup"][i].itemID] = numB;
//         }
//     }
//     onhook.lastCompleteTime = nowtime;



//     // let numB = Math.floor(tt / (this.config("base","AFKreward").val * 1000));
//     // if (numB <= 0) {
//     //     return this.quick_error("m2sgrbs12", "没有达到最低挂机时间", add_tt);
//     // }
//     // let numE = Math.floor(tt / (this.config("hookBase").indevE * 1000));
//     //给基本货币奖励
//     // let _stage = this.updater.role.get("stage");
//     // let _stage_config = this.config("hookReward", _stage.normal);

//     // if (_stage_config) {
//     //     if (numB > 0) {
//     //         // let _step = this.updater.role.get(50000006) || 0;
//     //         // let _step = this.updater.role.get(50000007) || 0;
//     //         // console.log('======BobFindMe======');
//     //         // console.log('gs', _step, this.config('base', 'firstHookStep'));
//     //         // if (_step == this.config('base', 'firstHookStep')) {
//     //         //     _hook_add[this.config('base', 'firstHookKey')] = this.config('base', 'firstHookVal');
//     //         //     // console.log(_hook_add);
//     //         // } else {
//     //             _total_add['60100000'] = numB;
//     //             _total_add['60100002'] = numB;
//     //             _hook_add[_stage_config.boxID]=numB;
//     //             // for (let k of _stage_config.hookItems) {
//     //             //     if (k) {
//     //             //         if (_hook_add[k]) {
//     //             //             _hook_add[k] += numE;
//     //             //         } else {
//     //             //             _hook_add[k] = numE;
//     //             //         }
//     //             //     }
//     //             // }
//     //         // }
//     //     }
//     //     // for (let k of _stage_config.hookMoney) {
//     //     //     if (k.id) {
//     //     //         if ((k.id == 10001) && add_tt) {
//     //     //             continue;
//     //     //         }
//     //     //         if (_total_add[k.id]) {
//     //     //             _total_add[k.id] += k.num * numB * specAwardOffset;
//     //     //         } else {
//     //     //             _total_add[k.id] = k.num * numB * specAwardOffset;
//     //     //         }
//     //     //     }
//     //     // }
//     // }
//     //随机宝箱逐一添加（略蛋疼）
//     for (let i in _hook_add) {
//         let id = parseInt(i);
//         if (id) {
//             for (let j = 0; j < _hook_add[id]; ++j) {
//                 let { err, ret } = this.library("item/group", id, 1);
//                 // let {err,ret} = this.updater.item.group(id,1);
//                 if (err) {
//                     return this.error(err, ret);
//                 }
//                 if (Array.isArray(ret)) {
//                     for (let v in ret) {
//                         if (_total_add.hasOwnProperty(ret[v].id)) {
//                             _total_add[ret[v].id] += ret[v].num;
//                         } else {
//                             _total_add[ret[v].id] = ret[v].num;
//                         }
//                     }
//                 } else {
//                     if (_total_add.hasOwnProperty(ret.id)) {
//                         _total_add[ret.id] += ret.num;
//                     } else {
//                         _total_add[ret.id] = ret.num;
//                     }
//                 }

//                 // for(let v in ret){
//                 //     if(_total_add.hasOwnProperty(ret[v].id)){
//                 //         _total_add[ret[v].id]+=ret[v].num;
//                 //      }else{
//                 //         _total_add[ret[v].id] = ret[v].num;
//                 //      }
//                 // }
//             }
//         }
//     }
//     for (let i in _total_add) {
//         if (t) {
//             if (hangReward.hasOwnProperty(i)) {
//                 _total_add[i] += hangReward[i].val;
//             }
//             this.updater.add(parseInt(i), _total_add[i]);
//             delete hangReward[i];
//         } else {
//             if (hangReward.hasOwnProperty(i)) {
//                 hangReward[i].val += _total_add[i];
//             } else {
//                 hangReward[i] = { "val": _total_add[i] };
//             }
//         }
//         // this.updater.add(parseInt(i), _total_add[i]);
//     }
//     if (t) {
//         for (let i in hangReward) {
//             this.updater.add(parseInt(i), hangReward[i].val);
//             delete hangReward[i];
//         }
//         this.updater.record.add(33, 1);
//     }


//     this.updater.role.set("onhook", onhook);
//     this.updater.role.set("hangReward", hangReward);
//     if (!t) {
//         await this.updater.save();
//         return hangReward;
//     } else {
//         let dayCNum = this.updater.daily.get('hookCNum') || 0;
//         dayCNum++;
//         this.updater.daily.set('hookCNum', dayCNum);
//         this.updater.daily.set("record.33", dayCNum);
//         return this.updater.save();
//     }
// }
